package cn.icatw.leetcode.editor.cn;
//按照国际象棋的规则，皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
//
// n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上，并且使皇后彼此之间不能相互攻击。
//
// 给你一个整数 n ，返回所有不同的 n 皇后问题 的解决方案。
//
//
//
// 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案，该方案中 'Q' 和 '.' 分别代表了皇后和空位。
//
//
//
//
//
// 示例 1：
//
//
//输入：n = 4
//输出：[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
//解释：如上图所示，4 皇后问题存在两个不同的解法。
//
//
// 示例 2：
//
//
//输入：n = 1
//输出：[["Q"]]
//
//
//
//
// 提示：
//
//
// 1 <= n <= 9
//
//
// Related Topics 数组 回溯 👍 2103 👎 0


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//Java：N 皇后
public class T51_NQueens {
    public static void main(String[] args) {
        Solution solution = new T51_NQueens().new Solution();
        // TO TEST
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public List<List<String>> solveNQueens(int n) {
            List<List<String>> res = new ArrayList<>();
            backtrack(res, new ArrayList<>(), n, new boolean[n], new boolean[2 * n], new boolean[2 * n], 0);
            return res;
        }

        private void backtrack(List<List<String>> res, List<String> board, int n, boolean[] cols, boolean[] diag1, boolean[] diag2, int row) {
            if (row == n) {
                res.add(new ArrayList<>(board));
                return;
            }

            for (int col = 0; col < n; col++) {
                int d1 = row - col + n; // 对角线 1
                int d2 = row + col; // 对角线 2
                if (cols[col] || diag1[d1] || diag2[d2]) {
                    continue;
                }

                char[] rowArr = new char[n];
                Arrays.fill(rowArr, '.');
                rowArr[col] = 'Q';
                board.add(new String(rowArr));

                cols[col] = true;
                diag1[d1] = true;
                diag2[d2] = true;

                backtrack(res, board, n, cols, diag1, diag2, row + 1);

                board.remove(board.size() - 1);
                cols[col] = false;
                diag1[d1] = false;
                diag2[d2] = false;
            }
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
